<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 1- 值类型的赋值操作是深复制还是浅复制？
	// 答：所谓的深复制与浅复制是针对于引用类型的数据而言的。
	//    深复制：复制出来的数据与原数据没有任何关系。（复制出来的数据在内存是独立的，不会复制原数据的引用地址）
	//    浅复制：复制出来的数据与原数据有关联。（复制出来的数据对应的引用地址与原数据有相同的）
	//    值类型的赋值操作是深复制。
	// let a = 1;
	// let b = a;
	
	// 2- 对简单数组（数组的元素不包含引用类型）实现复制，以下属性深复制：
	// let arr = [1,2,3,4];
	// let arr2 = [...arr];
	// let arr3 = arr.concat();
	// let arr4 = [].concat(arr);
	// let arr5 = arr.map(item=>item);
	// let arr6 = Array.from(arr);
	// console.log(arr,arr2,arr3,arr4,arr5,arr6);
	// console.log(arr===arr2,arr3===arr4,arr5===arr6);
	
	// 3- 对简单对象（对象的属性值不是引用类型）实现复制，以下属性深复制
	// let obj = {
	// 	a:1,
	// 	b:2
	// }
	// let obj2 = {...obj};
	// let obj3 = Object.assign({},obj);
	// let obj4 = {};
	// for(let key in obj){
	// 	obj4[key] = obj[key]
	// }
	
	// 4- 对于复杂对象（对象的属性值包含引用类型数据），复杂数组（数组的元素包含引用类型数据）而言，以下都是浅复制
	// let obj = {
	// 	userName:"zhangsan",
	// 	a:[1,2,3],
	// 	b:{
	// 		age:13,
	// 		info:{
	// 			sex:"男"
	// 		}
	// 	}
	// }
	// let obj2 = {...obj};
	// console.log(obj2.a === obj.a);
	
	// 5- 如何实现深复制？通过JSON对象实现，但是有问题。
	// let obj = {
	// 	userName:"zhangsan",
	// 	a:[1,2,3],
	// 	b:{
	// 		age:13,
	// 		info:{
	// 			sex:"男"
	// 		}
	// 	}
	// }
	// const obj2 = JSON.parse(JSON.stringify(obj));
	// console.log(obj2===obj);// false
	// console.log(obj2.a===obj.a);// false
	
	// 6- 自定义函数
	let obj = {
		userName: "zhangsan",
		a: [1, 2, 3],
		b: {
			age: 13,
			info: {
				sex: "男"
			}
		},
		fn() {
			console.log("fn")
		}
	}
	
	function deepClone(data) {
		if (typeof data !== "object") return data;
		// 最终深复制的数据都会存放在这里。
		let copyData = Array.isArray(data) ? [] : {};
		for (let key in data) {
			if (typeof data[key] === "object") {
				copyData[key] = deepClone(data[key]);
			} else copyData[key] = data[key];
		}
		return copyData;
	}
	
	const obj2 = deepClone(obj);
	console.log(obj2===obj);
	console.log(obj2.a === obj.a);
	obj2.fn();


</script>
</html>